package doing.doing_001_500;

import org.junit.Test;

import java.util.Stack;

import static com.study.util.LogUtil.info;

/**
 * 232. Implement Queue using Stacks 用栈实现队列
 * <p>
 * 使用栈实现队列的下列操作：
 * push(x) -- 将一个元素放入队列的尾部。
 * pop()   -- 从队列首部移除元素。
 * peek()  -- 返回队列首部的元素。
 * empty() -- 返回队列是否为空。
 * 说明:
 * 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque（双端队列）来模拟一个栈，只要是标准的栈操作即可。
 * 假设所有操作都是有效的 （例如，一个空的队列不会调用 pop 或者 peek 操作）。
 * <p>
 * 2019-04-18 12:25 AM
 **/
@SuppressWarnings("all")
public class ImplementQueueUsingStacks {

    class MyQueue {
        private Stack<Object> stack1 = null;
        private Stack<Object> stack2 = null;

        public MyQueue() {
            stack1 = new Stack<>();
            stack2 = new Stack<>();
        }

        public void push(int x) {
            stack1.push(x);
        }

        public int pop() {

            int value = 0;

            while (!stack1.empty()) {
                stack2.push(stack1.peek());
                stack1.pop();
            }

            value = (int) stack2.pop();

            while (!stack2.empty()) {
                stack1.push(stack2.peek());
                stack2.pop();
            }

            return value;
        }

        public int peek() {

            int value = 0;

            while (!stack1.empty()) {
                stack2.push(stack1.peek());
                stack1.pop();
            }

            value = (int) stack2.peek();

            while (!stack2.empty()) {
                stack1.push(stack2.peek());
                stack2.pop();
            }

            return value;
        }

        public boolean empty() {
            return stack1.empty();
        }
    }

    @Test
    public void test() {
        MyQueue queue = new MyQueue();
        queue.push(1);
        queue.push(2);
        info("1 -> {}", queue.peek());  // 返回 1
        info("1 -> {}", queue.pop());   // 返回 1
        info("false -> {}", queue.empty()); // 返回 false
    }
}









































/*
class MyQueue {
    private Stack<Object> stack1 = null;
    private Stack<Object> stack2 = null;

    public MyQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void push(int x) {
        stack1.push(x);
    }

    public int pop() {

        int value = 0;

        while (!stack1.empty()) {
            stack2.push(stack1.peek());
            stack1.pop();
        }

        value = (int) stack2.pop();

        while (!stack2.empty()) {
            stack1.push(stack2.peek());
            stack2.pop();
        }

        return value;
    }

    public int peek() {

        int value = 0;

        while (!stack1.empty()) {
            stack2.push(stack1.peek());
            stack1.pop();
        }

        value = (int) stack2.peek();

        while (!stack2.empty()) {
            stack1.push(stack2.peek());
            stack2.pop();
        }

        return value;
    }

    public boolean empty() {
        return stack1.empty();
    }
}
*/